//019. 计算星期天的数量
//        以下是一些已知信息，但是或许你需要自己做一些其他的调查。
//        ⚫ 1900 年 1 月 1 日是星期一。
//        ⚫ 30 天的月份有：9 月，4 月，6 月，1 1 月。
//        ⚫ 此外的月份都是 31 天，当然 2 月除外。
//        ⚫ 2 月在闰年有 29 天，其他时候有 28 天。
//        ⚫ 年份可以被 4 整除的是闰年，但是不能 400 整除的世纪年（100 的整数倍年）除外。
//        求：20 世纪（1901 年 1 月 1 日到 2000 年 12 月 31 日）一共有多少个星期日落在了
//        当月的第一天？
//        答案：171


public class Week019 {
    //蔡勒公式只适合于1582年（中国明朝万历十年）10月15日之后的情形
    //w：星期； w对7取模得：0-星期日，1-星期一，2-星期二，3-星期三，4-星期四，5-星期五，6-星期六
    //c：世纪（注：一般情况下，在公式中取值为已经过的世纪数，也就是年份除以一百的结果，而非正在进行的世纪，也就是现在常用的年份除以一百加一；不过如果年份是公元前的年份且非整百数的话，c应该等于所在世纪的编号，如公元前253年，是公元前3世纪，c就等于-3）
    //y：年（一般情况下是后两位数，如果是公元前的年份且非整百数，y应该等于cMOD100+100）
    //m：月（m大于等于3，小于等于14，即在蔡勒公式中，某年的1、2月要看作上一年的13、14月来计算，比如2003年1月1日要看作2002年的13月1日来计算）
    //d：日
    static int Zeller(int year, int month, int day) {
        if (month < 3) {
            --year;
            month += 12;
        }
        int c = year / 100;
        year -= c * 100;
        return (day + 13 * (month + 1) / 5 + year + year / 4 + c / 4 + 5 * c) % 7;
    }

    static void run() {
        int ans = 0;
        for (int year = 1901; year <= 2000; ++year) {
            for (int month = 1; month <= 12; ++month) {
                if (Zeller(year, month, 1) == 1) ++ans;
            }
        }
        System.out.println(ans);
    }

//    static boolean LeapYear(int year) {
//        return year % 400 == 0 || (year % 100 != 0 && year % 4 == 0);
//    }
//    static void run() {
//        int[] days = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//        int star = 1;
//        int ans = 0;
//        star = (star + 365) % 7;
//        for (int year = 1901; year <= 2000; ++year) {
//            days[2] = LeapYear(year) ? 29 : 28;
//            for (int month = 1; month <= 12; ++month) {
//                if (star == 0) ++ans;
//                for (int day = 1; day <= days[month]; ++day) {
//                    star = (star + 1) % 7;//计算后一天是星期几
//                }
//            }
//        }
//        System.out.println(ans);
//    }

    public static void main(String[] args) {
        long startTime = System.nanoTime();
        run();
        System.out.println("\n程序运行时间：" + (System.nanoTime() - startTime) + "ns.");
    }
}
